<table>
<tr><td>Longitude: -122.292646</td></tr>
<tr><td>Latitude: 37.524989</td></tr>
-<tr><td>Heading: 312.3</td></tr>
</table>
]]></description>
<LookAt>
<table>
<tr><td>Longitude: -122.292093</td></tr>
<tr><td>Latitude: 37.520199</td></tr>
-<tr><td>Heading: 312.3</td></tr>
</table>
]]></description>
<LookAt>
<table>
<tr><td>Longitude: -122.291970</td></tr>
<tr><td>Latitude: 37.515653</td></tr>
-<tr><td>Heading: 312.2</td></tr>
</table>
]]></description>
<LookAt>
<table>
<tr><td>Longitude: -122.291356</td></tr>
<tr><td>Latitude: 37.510277</td></tr>
-<tr><td>Heading: 312.2</td></tr>
</table>
]]></description>
<LookAt>
<table>
<tr><td>Longitude: -122.292584</td></tr>
<tr><td>Latitude: 37.528654</td></tr>
-<tr><td>Heading: 312.3</td></tr>
</table>
]]></description>
<LookAt>
<table>
<tr><td>Longitude: -122.292277</td></tr>
<tr><td>Latitude: 37.530854</td></tr>
-<tr><td>Heading: 312.3</td></tr>
</table>
]]></description>
<LookAt>
<table>
<tr><td>Longitude: -122.292032</td></tr>
<tr><td>Latitude: 37.533444</td></tr>
-<tr><td>Heading: 312.3</td></tr>
</table>
]]></description>
<LookAt>
<table>
<tr><td>Longitude: -122.291663</td></tr>
<tr><td>Latitude: 37.535986</td></tr>
-<tr><td>Heading: 312.3</td></tr>
</table>
]]></description>
<LookAt>
<table>
<tr><td>Longitude: -122.291541</td></tr>
<tr><td>Latitude: 37.538136</td></tr>
-<tr><td>Heading: 312.3</td></tr>
</table>
]]></description>
<LookAt>
<table>
<tr><td>Longitude: -122.291847</td></tr>
<tr><td>Latitude: 37.517951</td></tr>
-<tr><td>Heading: 312.2</td></tr>
</table>
]]></description>
<LookAt>
<table>
<tr><td>Longitude: -122.291111</td></tr>
<tr><td>Latitude: 37.513161</td></tr>
-<tr><td>Heading: 312.2</td></tr>
</table>
]]></description>
<LookAt>
<table>
<tr><td>Longitude: -122.261028</td></tr>
<tr><td>Latitude: 37.507931</td></tr>
-<tr><td>Heading: 312.2</td></tr>
</table>
]]></description>
<LookAt>
<tr><td>Longitude: -91.610350</td></tr>
<tr><td>Latitude: 30.062183</td></tr>
<tr><td>Altitude: 3.281 ft</td></tr>
-<tr><td>Heading: 300.1</td></tr>
<tr><td>Time: 2002-05-25T17:06:21Z</td></tr>
</table>
]]></description>
<tr><td>Longitude: -91.610350</td></tr>
<tr><td>Latitude: 30.062183</td></tr>
<tr><td>Altitude: 3.281 ft</td></tr>
-<tr><td>Heading: 300.1</td></tr>
<tr><td>Time: 2002-05-25T17:06:21Z</td></tr>
</table>
]]></description>
<tr><td>Cadence: 245</td></tr>
<tr><td>Heart rate: 25</td></tr>
<tr><td>Power: 88.9</td></tr>
-<tr><td>Heading: 317.9</td></tr>
</table>
]]></description>
<LookAt>
<tr><td>Temperature: 19.8</td></tr>
<tr><td>Depth: 818.2 ft</td></tr>
<tr><td>Speed: 65.4 mph</td></tr>
-<tr><td>Heading: 25.6</td></tr>
+<tr><td>Heading: 34.9</td></tr>
<tr><td>Time: 1970-01-01T00:00:09.290Z</td></tr>
</table>
]]></description>
<tr><td>Temperature: 23.9</td></tr>
<tr><td>Depth: 2233.7 ft</td></tr>
<tr><td>Speed: 125.4 mph</td></tr>
-<tr><td>Heading: 50.7</td></tr>
+<tr><td>Heading: 52.9</td></tr>
<tr><td>Time: 1970-01-01T00:00:24.084Z</td></tr>
</table>
]]></description>
<tr><td>Cadence: 40</td></tr>
<tr><td>Depth: 2066.8 ft</td></tr>
<tr><td>Speed: 160.6 mph</td></tr>
-<tr><td>Heading: 38.0</td></tr>
+<tr><td>Heading: 45.1</td></tr>
<tr><td>Time: 1970-01-01T00:00:31.102Z</td></tr>
</table>
]]></description>
<tr><td>Longitude: -117.422570</td></tr>
<tr><td>Latitude: 36.339560</td></tr>
<tr><td>Altitude: 1572.507 ft</td></tr>
-<tr><td>Heading: 309.7</td></tr>
</table>
]]></description>
<LookAt>
<tr><td>Longitude: -117.072030</td></tr>
<tr><td>Latitude: 36.236600</td></tr>
<tr><td>Altitude: 7455.052 ft</td></tr>
-<tr><td>Heading: 309.5</td></tr>
</table>
]]></description>
<LookAt>
<table>
<tr><td>Longitude: -116.879080</td></tr>
<tr><td>Latitude: 36.463670</td></tr>
-<tr><td>Heading: 309.6</td></tr>
</table>
]]></description>
<LookAt>
<tr><td>Altitude: 0.449 ft</td></tr>
<tr><td>Cadence: 151</td></tr>
<tr><td>Heart rate: 111</td></tr>
-<tr><td>Heading: 360.0</td></tr>
<tr><td>Time: 2008-08-20T07:04:48Z</td></tr>
</table>
]]></description>
<table>
<tr><td>Longitude: -86.844140</td></tr>
<tr><td>Latitude: 35.826146</td></tr>
-<tr><td>Heading: 305.9</td></tr>
</table>
]]></description>
<LookAt>
<table>
<tr><td>Longitude: -86.844140</td></tr>
<tr><td>Latitude: 35.826146</td></tr>
-<tr><td>Heading: 305.9</td></tr>
</table>
]]></description>
<LookAt>
<table>
<tr><td>Longitude: -86.844140</td></tr>
<tr><td>Latitude: 35.836146</td></tr>
-<tr><td>Heading: 305.9</td></tr>
<tr><td>Time: 2007-07-27T05:24:05Z</td></tr>
</table>
]]></description>
<table>
<tr><td>Longitude: -86.844140</td></tr>
<tr><td>Latitude: 35.826146</td></tr>
-<tr><td>Heading: 305.9</td></tr>
</table>
]]></description>
<LookAt>
<table>
<tr><td>Longitude: -86.844140</td></tr>
<tr><td>Latitude: 35.836146</td></tr>
-<tr><td>Heading: 305.9</td></tr>
<tr><td>Time: 2007-07-27T05:24:05Z</td></tr>
</table>
]]></description>
<trkseg>
<trkpt lat="0.000000000" lon="2.999550663">
<time>2010-01-01T00:00:00Z</time>
- <speed>0.000000</speed>
</trkpt>
<trkpt lat="0.000000000" lon="2.999649517">
<time>2010-01-01T00:00:00.200Z</time>
<trkseg>
<trkpt lat="0.000000000" lon="2.999550663">
<time>2010-01-01T00:00:00Z</time>
- <speed>0.000000</speed>
</trkpt>
<trkpt lat="0.000000000" lon="2.999649517">
<time>2010-01-01T00:00:00.200Z</time>
<trkseg>
<trkpt lat="0.000000000" lon="3.000134801">
<time>2010-01-01T00:00:01Z</time>
- <speed>0.000000</speed>
</trkpt>
<trkpt lat="0.000000000" lon="3.000278589">
<time>2010-01-01T00:00:01.200Z</time>
<tr><td>Longitude: -91.610350</td></tr>
<tr><td>Latitude: 30.062183</td></tr>
<tr><td>Altitude: 1.000 meters</td></tr>
-<tr><td>Heading: 300.1</td></tr>
<tr><td>Time: 2002-05-25T17:06:21.250Z</td></tr>
</table>
]]></description>
No,Latitude,Longitude,Speed,Date,Time\r
-1,0.000000,2.999551,0.00,2010/01/01,00:00:00\r
+1,0.000000,2.999551,,2010/01/01,00:00:00\r
2,0.000000,2.999641,50.02,2010/01/01,00:00:00.200\r
3,0.000000,2.999730,50.02,2010/01/01,00:00:00.400\r
4,0.000000,2.999820,50.02,2010/01/01,00:00:00.600\r
* Run over all the trackpoints, computing heading (course), speed, and
* and so on.
*
- * If trkdatap is non-null upon entry, a pointer to an allocated collection
- * (hopefully interesting) statistics about the track will be placed there.
+ * return a collection of (hopefully interesting) statistics about the track.
*/
computed_trkdata track_recompute(const route_head* trk)
{
- Waypoint first;
- const Waypoint* prev = &first;
+ const Waypoint* prev = nullptr;
int tkpt = 0;
int pts_hrt = 0;
double tot_hrt = 0.0;
double tot_pwr = 0.0;
computed_trkdata tdata;
-// first.latitude = 0;
-// first.longitude = 0;
-// first.creation_time = 0;
-
foreach (Waypoint* thisw, trk->waypoint_list) {
- /*
- * gcdist and heading want radians, not degrees.
- */
- double tlat = RAD(thisw->latitude);
- double tlon = RAD(thisw->longitude);
- double plat = RAD(prev->latitude);
- double plon = RAD(prev->longitude);
- thisw->set_course(heading_true_degrees(plat, plon, tlat, tlon));
- double dist = radtometers(gcdist(plat, plon, tlat, tlon));
-
- /*
- * Avoid that 6300 mile jump as we move from 0,0.
- */
- if (plat && plon) {
+ if (prev != nullptr) {
+ /*
+ * gcdist and heading want radians, not degrees.
+ */
+ double tlat = RAD(thisw->latitude);
+ double tlon = RAD(thisw->longitude);
+ double plat = RAD(prev->latitude);
+ double plon = RAD(prev->longitude);
+ if (!thisw->course_has_value()) {
+ // Only recompute course if the waypoint
+ // didn't already have a course.
+ thisw->set_course(heading_true_degrees(plat, plon, tlat, tlon));
+ }
+ double dist = radtometers(gcdist(plat, plon, tlat, tlon));
tdata.distance_meters += dist;
- }
- /*
- * If we've moved as much as a meter,
- * conditionally recompute speeds.
- */
- if (!thisw->speed_has_value() && (dist > 1)) {
- // Only recompute speed if the waypoint
- // didn't already have a speed
- if (thisw->GetCreationTime().isValid() &&
- prev->GetCreationTime().isValid() &&
- thisw->GetCreationTime() > prev->GetCreationTime()) {
- double timed =
- prev->GetCreationTime().msecsTo(thisw->GetCreationTime()) / 1000.0;
- thisw->set_speed(dist / timed);
+ /*
+ * If we've moved as much as a meter,
+ * conditionally recompute speeds.
+ */
+ if (!thisw->speed_has_value() && (dist > 1)) {
+ // Only recompute speed if the waypoint
+ // didn't already have a speed
+ if (thisw->GetCreationTime().isValid() &&
+ prev->GetCreationTime().isValid() &&
+ thisw->GetCreationTime() > prev->GetCreationTime()) {
+ double timed =
+ prev->GetCreationTime().msecsTo(thisw->GetCreationTime()) / 1000.0;
+ thisw->set_speed(dist / timed);
+ }
}
}
+
if (thisw->speed_has_value()) {
if ((!tdata.min_spd) || (thisw->speed_value() < tdata.min_spd)) {
tdata.min_spd = thisw->speed_value();
}
if (first) {
if (opt_course) {
- // TODO: the course value 0 isn't valid, wouldn't it be better to UNSET course?
- wpt->set_course(0);
+ wpt->reset_course();
}
if (opt_speed) {
- // TODO: the speed value 0 isn't valid, wouldn't it be better to UNSET speed?
- wpt->set_speed(0);
+ wpt->reset_speed();
}
first = false;
last_course_lat = wpt->latitude;